/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import src.j2ee.compumake.dominio.Marca;
import src.j2ee.compumake.dominio.Memoria;
import src.j2ee.compumake.dominio.Producto;
import src.j2ee.compumake.dominio.TarjetaMadre;
import src.j2ee.compumake.dominio.TipoMemoria;
import src.j2ee.compumake.dominio.VelocidadMemoria;

/************************************************************************
 **                                                                    **
 ** Nombre: DAOMemoria.java                                            **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 25/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAOMemoria {
    private static final String TABLA_MEMORIA = "Memorias";
    private static final String ID_MEMORIA = "idMemoria";
    private static final String MARCA = "marca";
    private static final String NOMBRE = "nombre";
    private static final String TIPO = "tipo";
    private static final String VELOCIDAD = "velocidad";
    private Connection conexion;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    
    public DAOMemoria(){
        this.conexion = this.acceso.abrirConexion();
    }
    
    public Memoria buscarMemoria(int idMemoria){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_MEMORIA+" WHERE "+ID_MEMORIA+"='"+idMemoria+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            if(resultado.first()){
                int idMarca = resultado.getInt(2);
                String nombre = resultado.getString(3);
                int idTipo = resultado.getInt(4);
                int idVelocidad = resultado.getInt(5);
                DAOMarca daomarca = new DAOMarca();
                Marca marca = daomarca.buscaMarca(idMarca);
                DAOTipoMemoria daoTipoMemoria = new DAOTipoMemoria();
                TipoMemoria tipoMemoria = daoTipoMemoria.buscaTipoMemoria(idMemoria);
                DAOVelocidadMemoria daoVelocidad = new DAOVelocidadMemoria();
                VelocidadMemoria velocidad = daoVelocidad.buscaVelocidadMemoria(idVelocidad);
                DAOProducto daoProducto = new DAOProducto();
                int existencias = daoProducto.obtenerExistenciaProducto(idMemoria, (daoProducto.getTipos().get(Memoria.class)).intValue());
                double precio = daoProducto.obtenerExistenciaProducto(idMemoria, (daoProducto.getTipos().get(Memoria.class)).intValue());
                String ruta = daoProducto.obtenerRutaImagen(idMemoria, (daoProducto.getTipos().get(Memoria.class)).intValue());
                Memoria m = new Memoria(tipoMemoria, velocidad, idMemoria, nombre, marca, existencias, ruta, precio);
                return m;
            }else{
                return null;
            }
        }catch(SQLException ex){
            return null;
        }
    }
    
    public ArrayList<Memoria> listarMemorias(){
        ArrayList<Memoria> memorias = new ArrayList<>();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+ID_MEMORIA+" FROM "+TABLA_MEMORIA;
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idMemoria = resultado.getInt(1);
                Memoria m = this.buscarMemoria(idMemoria);
                if(m!=null){
                    memorias.add(m);
                }
            }
            return memorias;
        }catch(SQLException ex){
            return memorias;
        }
    }
    
    public Memoria insertaMemoria(Memoria memoria){
        Memoria m;
        try{
            String query = "INSERT INTO "+TABLA_MEMORIA+" ("+MARCA+","+NOMBRE+","+TIPO+","+VELOCIDAD+")"
                    +" VALUES ('"+memoria.getMarca().getClave()+"','"
                    +memoria.getNombre()+"','"+memoria.getTipoMemoria().getIdTipo()
                    +"','"+memoria.getVelocidad().getIdVelocidad()+"');";
            PreparedStatement sentencia = conexion.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            int afectados = sentencia.executeUpdate();
            if(afectados==0){
                return null;
            }else{
                ResultSet generado = sentencia.getGeneratedKeys();
                if(generado.next()){
                    int id = generado.getInt(1);
                    m = memoria;
                    m.setClave(id);
                   return m;
                }else{
                    return null;
                }
            }
        }
        catch (SQLException ex) {
            return null;
        }    }
    
    public ArrayList<Producto> listarCompatibles(TarjetaMadre tarjetaMadre){
        ArrayList<Producto> memorias = new ArrayList<>();
        try{
            String query = "SELECT "+ID_MEMORIA+" FROM "+TABLA_MEMORIA
                    +" WHERE "+TIPO+" IN "+this.obtenerCadenaTipoMemoria(tarjetaMadre.getTiposMemoria())
                    +" AND "+VELOCIDAD+" IN "+this.obtenerCadenaVelocidadesMemoria(tarjetaMadre.getVelocidadesMemoria());
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idMemoria = resultado.getInt(1);
                Memoria m = this.buscarMemoria(idMemoria);
                if(m!=null){
                    memorias.add(m);
                }
            }
            return memorias;
        }catch(SQLException ex){
            return memorias;
        }
        
    }
    
    private String obtenerCadenaTipoMemoria(ArrayList<TipoMemoria> tiposMemoria){
        String cadenaMemorias="(";
        if(tiposMemoria.size()>0){
            cadenaMemorias+="'"+tiposMemoria.get(0).getIdTipo()+"'";
            for(int i=1;i<tiposMemoria.size();i++){
                cadenaMemorias+=",'"+tiposMemoria.get(i).getIdTipo()+"'";
            }
            cadenaMemorias+=")";
        }
        return cadenaMemorias;
    }
    private String obtenerCadenaVelocidadesMemoria(ArrayList<VelocidadMemoria> velocidadesMemoria){
        String cadenaVelocidades="(";
        if(velocidadesMemoria.size()>0){
            cadenaVelocidades+="'"+velocidadesMemoria.get(0).getIdVelocidad()+"'";
            for(int i=1;i<velocidadesMemoria.size();i++){
                cadenaVelocidades+=",'"+velocidadesMemoria.get(i).getIdVelocidad()+"'";
            }
            cadenaVelocidades+=")";
        }
        return cadenaVelocidades;
    }
}
